home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / appsrcs.zip / MORSETUP.ZIP / MORSETUP.C < prev    next >
C/C++ Source or Header  |  1993-05-07  |  15KB  |  541 lines

  1. /*--------------------------------------------------------------------------/
  2.  MorSetup.c
  3.  
  4.  AppMore Setup, Setup program for AppMore.exe.
  5.  by
  6.  GMP van kempen
  7.  NEVERnever Software 1992
  8.  
  9.  history:
  10.     1.0     initial release 
  11.  
  12. /--------------------------------------------------------------------------*/
  13. #define STRICT
  14. #include <windows.h>
  15. #include <windowsx.h>
  16. #include <shellapi.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include "morsetup.h"
  21.  
  22. /* usefull global things */
  23.  
  24. HINSTANCE    hInst;     /* global instance handle */
  25. char        szAppName[] = "AppMore Setup";
  26. char        szSectionName[256];
  27. HWND        hWnd;
  28. HWND        hwndIcon[NUMICONS], hwndScroll, hwndEdit[NUMEDITS], hwndButton[NUMBUTTONS];
  29. HWND        hwndText[NUMEDITS], hwndRadioButton[3], hwndCloseProg, hwndNext[2];
  30. HWND        hwndButtonLook, hwndNoSound;
  31. BOOL        bCurrentIcon[NUMICONS], bSave = FALSE, bSaveButton[MAXAPPS];
  32. BOOL        bNewDir = FALSE;
  33. int        iCurrent = 0, iBlackIcon = 0, iPrevBlackIcon = 0, cxChar, cyChar;
  34. int        MaxIconNumber[MAXAPPS];
  35. FOCUS        nFocus = ICONFOCUS;
  36. HBITMAP     hAppSetup;
  37. HICON        hIcon[MAXAPPS], hBlank, hIconTemp;
  38. FARPROC     lpfnOldEdit[NUMEDITS];
  39. APPBARBUTTONS    AppButton[MAXAPPS], AppButtonDefault, AppButtonTemp;
  40. APPSYSTEM    AppSystem, AppSystemNew;
  41. APPSOUND    AppSound, AppSoundNew;
  42. char        Directory[256] = "c:", TempStr[256];
  43. static int    SectionNumber;
  44.  
  45. /*------------ main window message handler ---------------------------------*/
  46.  
  47. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow)
  48. {
  49.     MSG msg;
  50.     WNDCLASS wc;
  51.     int    yCaption, xSize, ySize;
  52.  
  53.     lstrcpy(szSectionName, lpszCmdLine);
  54.     AppSystem.SectionNumber = VerifySectionName(szSectionName);
  55.  
  56.     hInst = hInstance;
  57.     if(!hPrevInstance)
  58.     {
  59.     wc.style     = CS_HREDRAW | CS_VREDRAW;
  60.     wc.lpfnWndProc     = MainWndProc;
  61.     wc.cbClsExtra     = 0;
  62.     wc.cbWndExtra     = 0;
  63.     wc.hInstance     = hInstance;
  64.     wc.hCursor     = LoadCursor(NULL, IDC_ARROW);
  65.     wc.hIcon     = LoadIcon(hInstance,"Icon");
  66.     wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
  67.     wc.lpszMenuName     = NULL;
  68.     wc.lpszClassName = szAppName;
  69.  
  70.     RegisterClass(&wc);
  71.     }
  72.     else
  73.     {
  74.     OkMsgBox("AppMore Setup","AppMore Setup is already running");
  75.     return TRUE;
  76.     }
  77.  
  78.     Ctl3dRegister(hInst);
  79.     Ctl3dAutoSubclass(hInst);
  80.  
  81.     yCaption = GetSystemMetrics(SM_CYCAPTION);
  82.     xSize = 514;
  83.     ySize = 360 + yCaption;
  84.  
  85.     hWnd = CreateWindow(szAppName, szAppName,
  86.             WS_POPUP | WS_SYSMENU | WS_CAPTION |
  87.             WS_MINIMIZEBOX | WS_VISIBLE,
  88.             50, 50, xSize, ySize,
  89.             (HWND)NULL, (HMENU)NULL, hInstance, (LPSTR)NULL);
  90.  
  91.     if (!hWnd)
  92.     return TRUE;
  93.  
  94.     ShowWindow(hWnd, cmdShow);
  95.     UpdateWindow(hWnd);
  96.  
  97.     hAppSetup = LoadBitmap(hInst, "AppSetup");
  98.     hBlank = LoadIcon(hInst, "Blank");
  99.  
  100.     while (GetMessage(&msg, NULL, 0, 0))
  101.     {
  102.     TranslateMessage(&msg);
  103.     DispatchMessage(&msg);
  104.     }
  105.  
  106.     Ctl3dUnregister(hInst);
  107.     return (msg.wParam);
  108. }
  109.     
  110. /*************************************************************************/
  111. long WINAPI MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  112.     {
  113.     static DLGPROC   lpfnSystemDlgProc, lpfnInitDlgProc, lpfnExitDlgProc;
  114.     static DLGPROC   lpfnSelectDirDlgProc, lpfnSoundDlgProc, lpfnSectionDlgProc;
  115.     LPDRAWITEMSTRUCT lpIconDIS;
  116.     TEXTMETRIC         tm;
  117.     static HBRUSH    hHighLightBrush, hWhiteBrush;
  118.     HBRUSH         hbrush;
  119.     HDC          hDC;
  120.     RECT         rc;
  121.     BOOL         bChanged = FALSE;
  122.     char         szDropFile[MAXFILECHARS];
  123.     POINT         DropPoint;
  124.     int          i, OffsetFromBlackIcon, iDroppedIcon;
  125.  
  126.  
  127.     switch(message) {
  128.  
  129.     case WM_CREATE:
  130.     InitDefaultButton();
  131.     IniRead();
  132.     SetCaption(hWnd, "AppMore Setup");
  133.  
  134.     hHighLightBrush = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
  135.     hWhiteBrush = GetStockBrush(WHITE_BRUSH);
  136.  
  137.     tm = RetrieveTextMetrics(hWnd);
  138.     cxChar = tm.tmAveCharWidth;
  139.     cyChar = tm.tmHeight;
  140.  
  141.     for(i=0;i<MAXAPPS;i++)
  142.          LoadIconFromFile(&hIcon[i], i);
  143.  
  144.     CreateAllChildWindows(hWnd, hInst);
  145.     for(i=0;i<NUMICONS;i++)
  146.         bCurrentIcon[i] = FALSE;
  147.     bCurrentIcon[iBlackIcon] = TRUE;
  148.     SetScrollRange(hwndScroll, SB_CTL, 0, MAXAPPS-1, TRUE);
  149.     SetScrollPos(hwndScroll, SB_CTL, 0, TRUE);
  150.     UpdateScrollIcons(iBlackIcon);
  151.     UpdateCheckBoxes(iCurrent);
  152.  
  153.     if(!AppSystem.Initialized)
  154.         {
  155.         lpfnInitDlgProc = (DLGPROC) MakeProcInstance(InitDlgProc, hInst);
  156.         DialogBox(hInst, "InitDlg", hWnd, lpfnInitDlgProc);
  157.         FreeProcInstance((FARPROC) lpfnInitDlgProc);
  158.         AppSystem.Initialized = 1;
  159.         sprintf(szBuffer,"%d",AppSystem.Initialized);
  160.         WritePrivateProfileString(INI_APPMORE, INITIALIZED, szBuffer, INI_FILE);
  161.         }
  162.     DragAcceptFiles(hWnd, TRUE);
  163.     bSave = FALSE;
  164.     if(AppSystem.SectionNumber == 0)
  165.         SendMessage(hWnd, WM_COMMAND, IDC_BUTTONS+5, 0L);
  166.     break;
  167.  
  168.     case WM_SYSCOLORCHANGE:
  169.     Ctl3dColorChange();
  170.     break;
  171.  
  172.     case WM_CTLCOLOR:
  173.     hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
  174.     if(hbrush != (HBRUSH) FALSE)
  175.         return hbrush;
  176.     else
  177.         return DefWindowProc(hWnd, message, wParam, lParam);
  178.  
  179.     case WM_VSCROLL:
  180.     iPrevBlackIcon = iBlackIcon;
  181.     switch(wParam)
  182.         {
  183.         case SB_LINEUP:
  184.         iBlackIcon--;
  185.         iCurrent--;
  186.         break;
  187.  
  188.         case SB_LINEDOWN:
  189.         iBlackIcon++;
  190.         iCurrent++;
  191.         break;
  192.  
  193.         case SB_PAGEUP:
  194.         iCurrent -= NUMICONS;
  195.         break;
  196.  
  197.         case SB_PAGEDOWN:
  198.         iCurrent += NUMICONS;
  199.         break;
  200.  
  201.         case SB_THUMBTRACK:
  202.         iBlackIcon = LOWORD(lParam) % (MAXAPPS/NUMICONS);
  203.         iCurrent = LOWORD(lParam);
  204.         break;
  205.  
  206.         default:
  207.         break;
  208.         }
  209.     iBlackIcon = max(0, min(iBlackIcon, NUMICONS-1));
  210.     iCurrent = max(0, min(iCurrent, MAXAPPS-1));
  211.     if(iCurrent < NUMICONS)
  212.         iBlackIcon = iCurrent;
  213.     if(iCurrent > MAXAPPS-1 - NUMICONS)
  214.         iBlackIcon = NUMICONS-MAXAPPS+iCurrent;
  215.     bCurrentIcon[iPrevBlackIcon] = FALSE;
  216.     bCurrentIcon[iBlackIcon] = TRUE;
  217.     UpdateEditWindows(iCurrent);
  218.     UpdateRadioButtons(AppButton[iCurrent].ShowMode);
  219.     UpdateNextButtons(iCurrent);
  220.     UpdateCheckBoxes(iCurrent);
  221.     if(iCurrent != GetScrollPos(hwndScroll, SB_CTL))
  222.         {
  223.         ScrollBar_SetPos(hwndScroll, iCurrent, TRUE);
  224.         for(i=0;i<NUMICONS;i++)
  225.         InvalidateRect(hwndIcon[i], NULL, TRUE);
  226.         }
  227.     break;
  228.  
  229.    case WM_SETFOCUS:
  230.     SetFocus(hwndEdit[nFocus]);
  231.     break;
  232.  
  233.     case WM_DRAWITEM:
  234.     lpIconDIS = (LPDRAWITEMSTRUCT) lParam;
  235.     OffsetFromBlackIcon = (int) (lpIconDIS->CtlID-IDC_ICONS) - iBlackIcon;
  236.     // Draw an user-specified icon inside of the button
  237.     CopyRect((LPRECT) &rc, &(lpIconDIS->rcItem));
  238.     if(bCurrentIcon[lpIconDIS->CtlID-IDC_ICONS])
  239.         FillRect(lpIconDIS->hDC, (LPRECT) &rc, hHighLightBrush);
  240.     else
  241.         FillRect(lpIconDIS->hDC, (LPRECT) &rc, hWhiteBrush);
  242.     if(AppButton[iCurrent+OffsetFromBlackIcon].ButtonLook)
  243.         DrawIcon(lpIconDIS->hDC, rc.left+19, rc.top+18, hBlank);
  244.     if(hIcon[iCurrent+OffsetFromBlackIcon] != NULL)
  245.         DrawIcon(lpIconDIS->hDC, rc.left+19, rc.top+18, hIcon[iCurrent+OffsetFromBlackIcon]);
  246.     break;
  247.  
  248.     case WM_COMMAND:
  249.     switch(wParam)
  250.         {
  251.         case IDC_ICONS:
  252.         UpdateScrollIcons(0);
  253.         break;
  254.  
  255.         case IDC_ICONS+1:
  256.         UpdateScrollIcons(1);
  257.         break;
  258.  
  259.         case IDC_ICONS+2:
  260.         UpdateScrollIcons(2);
  261.         break;
  262.  
  263.         case IDC_ICONS+3:
  264.         UpdateScrollIcons(3);
  265.         break;
  266.  
  267.         case IDC_ICONS+4:
  268.         UpdateScrollIcons(4);
  269.         break;
  270.  
  271.         case IDC_RADIOS:
  272.         UpdateRadioButtons(0);
  273.         break;
  274.  
  275.         case IDC_RADIOS+1:
  276.         UpdateRadioButtons(1);
  277.         break;
  278.  
  279.         case IDC_RADIOS+2:
  280.         UpdateRadioButtons(2);
  281.         break;
  282.  
  283.         case IDC_RADIOS+3:
  284.         UpdateRadioButtons(3);
  285.         break;
  286.  
  287.         case IDC_CLOSEPROG:
  288.         bSave = TRUE;
  289.         bSaveButton[iCurrent] = TRUE;
  290.         AppButton[iCurrent].Close = Button_GetCheck(hwndCloseProg);
  291.         break;
  292.  
  293.         case IDC_BUTTONLOOK:
  294.         bSave = TRUE;
  295.         bSaveButton[iCurrent] = TRUE;
  296.         if(Button_GetCheck(hwndButtonLook))
  297.             AppButton[iCurrent].ButtonLook = 1;
  298.         else
  299.             AppButton[iCurrent].ButtonLook = 0;
  300.         InvalidateRect(hwndIcon[iBlackIcon], NULL, TRUE);
  301.         UpdateWindow(hwndIcon[iBlackIcon]);
  302.         break;
  303.  
  304.         case IDC_NEXT:
  305.         if(HIWORD(lParam) == BN_CLICKED)
  306.             Next(DOWN);
  307.         break;
  308.  
  309.         case IDC_NEXT+1:
  310.         if(HIWORD(lParam) == BN_CLICKED)
  311.             Next(UP);
  312.         break;
  313.  
  314.         case IDC_EDITS: /* program edit */
  315.         nFocus = EXEFOCUS;
  316.         if(HIWORD(lParam) == EN_KILLFOCUS)
  317.             {
  318.             bSave = TRUE;
  319.             bSaveButton[iCurrent] = TRUE;
  320.             Edit_GetText(hwndEdit[0], AppButton[iCurrent].ProgName, MAXFILECHARS-1);
  321.             Edit_SetText(hwndEdit[0], AppButton[iCurrent].ProgName);
  322.             LoadExeIcon(&hIcon[iCurrent], iCurrent);
  323.             nFocus = EXEFOCUS;
  324.             }
  325.         break;
  326.  
  327.         case IDC_EDITS+1: /* parameter edit */
  328.         nFocus = PARAMFOCUS;
  329.         if(HIWORD(lParam) == EN_KILLFOCUS)
  330.             {
  331.             bSave = TRUE;
  332.             bSaveButton[iCurrent] = TRUE;
  333.             Edit_GetText(hwndEdit[1], AppButton[iCurrent].Params, MAXFILECHARS-1);
  334.             Edit_SetText(hwndEdit[1], AppButton[iCurrent].Params);
  335.             }
  336.         break;
  337.  
  338.         case IDC_EDITS+2: /* directory edit */
  339.         nFocus = DIRFOCUS;
  340.         if(HIWORD(lParam) == EN_KILLFOCUS)
  341.             {
  342.             bSave = TRUE;
  343.             bSaveButton[iCurrent] = TRUE;
  344.             Edit_GetText(hwndEdit[2], AppButton[iCurrent].StartDir, MAXFILECHARS-1);
  345.             Edit_SetText(hwndEdit[2], AppButton[iCurrent].StartDir);
  346.             }
  347.         break;
  348.  
  349.         case IDC_EDITS+3: /* icon edit */
  350.         nFocus = ICONFOCUS;
  351.         if(HIWORD(lParam) == EN_KILLFOCUS)
  352.             {
  353.             bSave = TRUE;
  354.             bSaveButton[iCurrent] = TRUE;
  355.             Edit_GetText(hwndEdit[3], AppButton[iCurrent].IcoName, MAXFILECHARS-1);
  356.             Edit_SetText(hwndEdit[3], AppButton[iCurrent].IcoName);
  357.             DestroyIcon(hIcon[iCurrent]);
  358.             LoadIconFromFile(&hIcon[iCurrent], iCurrent);
  359.             InvalidateRect(hwndIcon[iBlackIcon], NULL, TRUE);
  360.             UpdateNextButtons(iCurrent);
  361.             }
  362.         break;
  363.  
  364.         case IDC_BUTTONS: /* Save */
  365.         if(stricmp(AppSystem.SectionName, "<none>") != 0)
  366.             {
  367.             IniSave();
  368.             bSave = FALSE;
  369.             }
  370.         break;
  371.  
  372.         case IDC_BUTTONS+1:  /* Exit */
  373.         if(bSave)
  374.             {
  375.             lpfnExitDlgProc = (DLGPROC) MakeProcInstance(ExitDlgProc, hInst);
  376.             DialogBox(hInst, "ExitDlg", hWnd, lpfnExitDlgProc);
  377.             FreeProcInstance((FARPROC) lpfnExitDlgProc);
  378.             }
  379.         else
  380.             SendMessage(hWnd, WM_DESTROY, 0, 0);
  381.         break;
  382.  
  383.         case IDC_BUTTONS+2:   /* Browse */
  384.         switch(nFocus)
  385.             {
  386.             case DIRFOCUS:
  387.             lpfnSelectDirDlgProc = (DLGPROC) MakeProcInstance(SelectDirDlgProc, hInst);
  388.             DialogBox(hInst, "SelectDirDlg", hWnd, lpfnSelectDirDlgProc);
  389.             FreeProcInstance((FARPROC) lpfnSelectDirDlgProc);
  390.             if(bNewDir)
  391.                 {
  392.                 strcpy(AppButton[iCurrent].StartDir, Directory);
  393.                 UpdateEditWindows(iCurrent);
  394.                 bNewDir = FALSE;
  395.                 }
  396.             break;
  397.  
  398.             case EXEFOCUS:
  399.             if(BrowseFile(AppButton[iCurrent].ProgName, hWnd, EXEFILES))
  400.                 {
  401.                 UpdateEditWindows(iCurrent);
  402.                 LoadExeIcon(&hIcon[iCurrent], iCurrent);
  403.                 UpdateNextButtons(iCurrent);
  404.                 }
  405.             break;
  406.  
  407.             case ICONFOCUS:
  408.             if(BrowseFile(AppButton[iCurrent].IcoName, hWnd, ICONFILES))
  409.                 {
  410.                 DestroyIcon(hIcon[iCurrent]);
  411.                 LoadIconFromFile(&hIcon[iCurrent], iCurrent);
  412.                 InvalidateRect(hwndIcon[iBlackIcon], NULL, FALSE);
  413.                 UpdateNextButtons(iCurrent);
  414.                 UpdateEditWindows(iCurrent);
  415.                 }
  416.             break;
  417.             }
  418.         break;
  419.  
  420.         case IDC_BUTTONS+3: /* system */
  421.         lpfnSystemDlgProc = (DLGPROC) MakeProcInstance(SystemDlgProc, hInst);
  422.         DialogBox(hInst, "SystemDlg", hWnd, lpfnSystemDlgProc);
  423.         FreeProcInstance((FARPROC) lpfnSystemDlgProc);
  424.         break;
  425.  
  426.         case IDC_BUTTONS+4: /* sound */
  427.         lpfnSoundDlgProc = (DLGPROC) MakeProcInstance(SoundDlgProc, hInst);
  428.         DialogBox(hInst, "SoundDlg", hWnd, lpfnSoundDlgProc);
  429.         FreeProcInstance((FARPROC) lpfnSoundDlgProc);
  430.         break;
  431.  
  432.         case IDC_BUTTONS+5: /* sections */
  433.         lpfnSectionDlgProc = (DLGPROC) MakeProcInstance(SectionDlgProc, hInst);
  434.         DialogBox(hInst, "SectionDlg", hWnd, lpfnSectionDlgProc);
  435.         FreeProcInstance((FARPROC) lpfnSectionDlgProc);
  436.         SetCaption(hWnd, "AppMore Setup");
  437.         break;
  438.  
  439.         case IDC_BUTTONS+6: /* help */
  440.         WinHelp(hWnd, "AppMore.hlp",HELP_CONTENTS, 0L);
  441.         break;
  442.  
  443.         case IDC_BUTTONS+7: /* insert */
  444.         Insert();
  445.         break;
  446.  
  447.         case IDC_BUTTONS+8: /* delete */
  448.         Delete();
  449.         break;
  450.  
  451.         case IDC_BUTTONS+9: /* move up */
  452.         MoveUp();
  453.         break;
  454.  
  455.         case IDC_BUTTONS+10: /* move down */
  456.         MoveDown();
  457.         break;
  458.         }
  459.     break;
  460.  
  461.     case WM_DROPFILES:
  462.     DragQueryPoint((HANDLE) wParam, (LPPOINT) &DropPoint);
  463.     DragQueryFile((HANDLE) wParam, 0, szDropFile, sizeof(szDropFile));
  464.     if(DropPoint.x < 100)
  465.         {
  466.         // file dropped over icon scrollbar
  467.         iDroppedIcon = 0;
  468.         while((iDroppedIcon*68+78) <= DropPoint.y)
  469.         {
  470.         iDroppedIcon++;
  471.         if(iDroppedIcon > 100)
  472.             break;
  473.         }
  474.         iDroppedIcon += (iCurrent-iBlackIcon);
  475.         strcpy(AppButton[iDroppedIcon].IcoName, szDropFile);
  476.         LoadIconFromFile(&hIcon[iDroppedIcon],iDroppedIcon);
  477.         if(iDroppedIcon == iCurrent)
  478.         UpdateScrollIcons(iBlackIcon);
  479.         else
  480.         {
  481.         iDroppedIcon -= (iCurrent-iBlackIcon);
  482.         InvalidateRect(hwndIcon[iDroppedIcon], NULL, TRUE);
  483.         UpdateWindow(hwndIcon[iDroppedIcon]);
  484.         }
  485.         }
  486.     else
  487.         if(DropPoint.x < 400)
  488.         {
  489.         // file dropped over edit windows
  490.         iDroppedIcon = 0;
  491.         while((iDroppedIcon*60+90) <= DropPoint.y)
  492.             {
  493.             iDroppedIcon++;
  494.             if(iDroppedIcon > 10)
  495.             break;
  496.             }
  497.         if(iDroppedIcon == 0) // program editwindow
  498.             {
  499.             strcpy(AppButton[iCurrent].ProgName, szDropFile);
  500.             Edit_SetText(hwndEdit[0], AppButton[iCurrent].ProgName);
  501.             LoadExeIcon(&hIcon[iCurrent], iCurrent);
  502.             InvalidateRect(hwndIcon[iBlackIcon], NULL, TRUE);
  503.             UpdateWindow(hwndIcon[iDroppedIcon]);
  504.             }
  505.         if(iDroppedIcon == 1) // params editwindow
  506.             {
  507.             strcpy(AppButton[iCurrent].Params, szDropFile);
  508.             Edit_SetText(hwndEdit[1], AppButton[iCurrent].Params);
  509.             }
  510.         if(iDroppedIcon == 2) // working directory editwindow
  511.             {
  512.             strcpy(AppButton[iCurrent].StartDir, szDropFile);
  513.             Edit_SetText(hwndEdit[2], AppButton[iCurrent].StartDir);
  514.             }
  515.         if(iDroppedIcon == 3) // icon editwindow
  516.             {
  517.             strcpy(AppButton[iCurrent].IcoName, szDropFile);
  518.             Edit_SetText(hwndEdit[3], AppButton[iCurrent].IcoName);
  519.             DestroyIcon(hIcon[iCurrent]);
  520.             LoadIconFromFile(&hIcon[iCurrent], iCurrent);
  521.             InvalidateRect(hwndIcon[iBlackIcon], NULL, TRUE);
  522.             UpdateNextButtons(iCurrent);
  523.             }
  524.         }
  525.     DragFinish((HANDLE) wParam);
  526.     break;
  527.  
  528.     case WM_DESTROY:
  529.     DragAcceptFiles(hWnd, FALSE);
  530.     DeleteBrush(hHighLightBrush);
  531.     DeleteBitmap(hAppSetup);
  532.         PostQuitMessage(0);
  533.         break;
  534.  
  535.     default:
  536.         return DefWindowProc(hWnd, message, wParam, lParam);
  537.         break;
  538.     }
  539.     return NULL;
  540.     }
  541.